/***********************************************************************************
Copy right:     Coffee Tech.
Author:         jiaoyue
Version:        V1.0
Date:           2019-09
Description:    字符串处理模块
***********************************************************************************/

#define STRING_OPT_C

#include "string_opt.h"

/**
* @brief            查找字符串中的字符，并替换一次
* @param str        源字符串
* @param src        被替换的字符
* @param dst        替换为的字符
* @return           成功返回0，失败返回-1
*/
int replace_first_char(char *str, char src, char dst)
{
    if (!str || strlen(str) == 0)
    {
        return -1;
    }

    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == src)
        {
            str[i] = dst;
            return 0;
        }
    }
    return -1;
}

/**
* @brief            查找字符串中的字符，返回其索引值（0起始）
* @param str        源字符串
* @param dst        查找的字符
* @return           成功返回>=0的索引值，失败返回-1
*/
int strchr_index(char *str, char c)
{
    if (!str || strlen(str) == 0)
    {
        return -1;
    }

    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == c)
        {
            return i;
        }
    }
    return -1;
}

/**
* @brief            倒序查找字符串中的字符，返回其索引值（0起始）
* @param str        源字符串
* @param dst        查找的字符
* @return           成功返回>=0的索引值，失败返回-1
*/
int strchr_invert(char *str, char c)
{
    int index;

    if (!str || strlen(str) == 0)
    {
        return -1;
    }

    index = strlen(str) - 1;
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[index - i] == c)
        {
            return index - i;
        }
    }
    return -1;
}

/**
* @brief 用新子串newstr替换源字符串src中的所包含的oldstr子串
* @param dst    目标串，也就是替换后的新串
* @param src    源字符串，被替换的字符串
* @param oldstr 旧的子串，将被替换的子串
* @param newstr 新的子串
* @return 正常返回替换次数，错误返回-1
*/
int str_replace_all(char *dst, char *src, const char *oldstr, const char *newstr)
{
    char *sub, *pc;
    int count = 0;

    dst[0] = '\0';
    pc = src;

    if (!dst || !src || !oldstr || !newstr)
    {
        return -1;
    }

    if (!strlen(src) || !strlen(oldstr))
    {
        return 0;
    }

    if (strcmp(oldstr, newstr) == 0)
    {
        return 0;
    }

    while ((sub = strstr(pc, oldstr)))
    {
        *sub = '\0';
        strcat(dst, pc);
        strcat(dst, newstr);
        pc = sub + strlen(oldstr);
        count++;
    }

    strcat(dst, pc);
    return count;
}


/**
* @brief 字符串数组排序
* @param string 字符串数组
* @param num    数组大小
* @return 正常返回0，错误返回-1
*/
int str_sort(char *string[], int num)
{
    char *temp;
    int i = 0;
    int j = 0;

    if (!string)
    {
        return -1;
    }

    for (i=0; i < num-1; i++)
    {
        for (j=0; j < num-i-1; j++)
        {
            if (strcmp(string[j], string[j+1]) > 0)
            {
                temp = string[j];
                string[j] = string[j+1];
                string[j+1] = temp;
            }
        }
    }
    return 0;
}


/**
* @brief 字符串替换字符，替换第一个
* @param str    字符串
* @param oldchr 被替换字符
* @param newchr 替换字符
* @return 正常返回0，错误返回-1
*/
int str_replace_chr_once(char *str, char oldchr, char newchr)
{
    if (!str)
    {
        return -1;
    }

    while (*str)
    {
        if (*str == oldchr)
        {
            *str = newchr;
            return 0;
        }
        str ++;
    }

    return -1;
}


/**
* @brief 字符串替换字符，替换全部
* @param str    字符串
* @param oldchr 被替换字符
* @param newchr 替换字符
* @return 正常返回替换次数
*/
int str_replace_chr_all(char *str, char oldchr, char newchr)
{
    int count = 0;

    if (!str)
    {
        return -1;
    }

    while (*str)
    {
        if (*str == oldchr)
        {
            *str = newchr;
            count ++;
        }
        str ++;
    }

    return count;
}

/**
* @brief 字符串剔除字符，剔除全部
* @param str    字符串
* @param chr    被剔除的字符
* @return 正常返回剔除后的字符串长度
*/
int str_kick_chr_all(char *str, char chr)
{
    int count = 0;
    char *pc = str;

    if (!str)
    {
        return -1;
    }

    while (*str)
    {
        if (*str != chr)
        {
            pc[count++] = *str;
        }
        str ++;
    }

    pc[count] = '\0';
    return count;
}
